#include "TriggerTimer.h"

#include "Pcie_X1075.h"
#include "CalculateManager.h"

TriggerTimer::TriggerTimer()
	: running(false), interval_ms(10000), flag_duration_ms(10) {  
	for (int i = 0; i < TriggerTimer_flagNumber; ++i) {
		flag[i].store(false);  // 初始化所有通道的标志为 false
		flagSetTime[i] = std::chrono::steady_clock::now();  // 初始化时间戳
		enabled[i] = false;    // 初始化所有通道为未使能状态
	}
}

TriggerTimer::~TriggerTimer()
{
	Stop();  // 析构时确保定时器停止
}

TriggerTimer triggerTimer;

/**
 *	启动定时器
 * 
 *	interval 间隔时间 触发采集一次 
 */
bool TriggerTimer::Start(int interval)
{
	if (running) return false;  // 防止定时器已经启动时再次启动

	interval_ms = interval;  // 设置定时器间隔

	running = true;

	// 启动定时器线程
	std::thread([this]() {
		while (running) {
			TimerCallback();
			std::this_thread::sleep_for(std::chrono::milliseconds(10));  // 每次循环等待 10 毫秒
		}
		}).detach();  // 分离线程，避免阻塞主线程

	return true;
}

void TriggerTimer::Stop()
{
	running = false;  // 停止定时器
}

void TriggerTimer::TimerCallback()
{
	auto now = std::chrono::steady_clock::now();
	auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - start_time).count();

	if (elapsed >= interval_ms) {
		// 如果间隔时间到了，开始设置标志
		for (int i = 0; i < TriggerTimer_flagNumber; ++i) {
			if (!flag[i].load()) {  // 只有当标志为 false 时才设置为 true
				flag[i].store(true);

				// 如果该通道尚未触发，则执行触发
				if (enabled[i] != true) {
					for (uint8_t ch = 1; ch <= MAX_CHANNEL_NUMBER; ++ch)
					{
						// 触发
						pcie_X1075.ChannelSoftwareTrigger(&handle, ch);
						std::cout << "Channel" << (int)ch << " 软件触发:" << elapsed << "ms" << std::endl;
					}
					enabled[i] = true;  // 标记通道为已触发
				}
				flagSetTime[i] = now;  // 记录当前通道的设置时间
				//std::cout << "Channel " << i << " flag set to true at: " << elapsed << " ms" << std::endl;
			}
		}
		// 记录上次触发时间
		start_time = now;
	}

	// 检查每个通道的标志是否超时，并重置为 false
	for (int i = 0; i < TriggerTimer_flagNumber; ++i) {
		if (std::chrono::duration_cast<std::chrono::milliseconds>(now - flagSetTime[i]).count() >= flag_duration_ms) {
			// 已持续超过 flag_duration_ms，则重置标志
			flag[i].store(false);

			// 如果该通道没有false，则执行false
			if (enabled[i] != false) {
				// 将回调计数器归零，等待下一次的采集
				//pcie_X1075.packeventCount[i] = 0;

				//std::cout << "Channel " << i << " flag set to false at: " << elapsed << " ms" << std::endl;

				enabled[i] = false;  // 标记通道为失能
			}
		}
	}

}



